// 二.基于以下代码完成下面的4个练习
const fp = require('lodash/fp')
// 数据
// hoursepower 马力，dollar_value 价格 in_stock 库存
const cars = [{
    name: 'Ferrari FF',
    hoursepower: 660,
    dollar_value: 700000,
    in_stock: true
}, {
    name: 'Spyker C12 Zagato',
    hoursepower: 650,
    dollar_value: 648000,
    in_stock: false
}, {
    name: 'Jaguar XKR-S',
    hoursepower: 550,
    dollar_value: 132000,
    in_stock: false
}, {
    name: 'Audi R8',
    hoursepower: 525,
    dollar_value: 114200,
    in_stock: false
}, {
    name: 'Aston Martin One-77',
    hoursepower: 750,
    dollar_value: 1850000,
    in_stock: true
}, {
    name: 'Pagani Huayra',
    hoursepower: 700,
    dollar_value: 1300000,
    in_stock: false
}]
/*
  练习1:  
    let last_car = fp.last(cars)   获取最后一条数据
    fp.prop('in_stock', last_car)  获取最后一条数据的 in_stock 属性值

  实现 isLastInStock 函数, 要求使用 fp.flowRight() 
  把 fp.last(), fp.prop() 组合而成
*/
// 实现 isLastInStock 函数, 要求使用 fp.flowRight() 
function isLastInStock(data) {
    let prop = (arr) => {
        return fp.prop("in_stock", arr)
    }
    let last = () => {
        return fp.last(data)
    }
    let r = fp.flowRight(prop, last)
    return r(); 
}

console.log(isLastInStock(cars))

/*
  练习2: 
  实现 firstName 函数, 要求使用 fp.flowRight()
  把 fp.prop(), fp.first() 组合而成
*/
// 1.实现 firstName 函数
function firstName(data) {
    let prop = (arr) => {
        return fp.prop("in_stock", arr)
    }
    let first = () => {
        return fp.first(data)
    }
    let r = fp.flowRight(prop, first)
    return r(); 
}


console.log(firstName(cars)) 

/*
  练习3: 
  实现函数 averageDollarValue, 要求使用 fp.flowRight()
  把 fp.map(), _average() 组合而成
  
  参考代码:
    let averageDollarValue = function (cars) {
        let dollar_values = fp.map(function (car) {
            return car.dollar_value
        }, cars)
        return _average(dollar_values)
    }
*/
let _average = function (xs) {
    console.log(xs)
    return fp.reduce(fp.add, 0, xs) / xs.length
} // <- 无须改动

// 1.实现 averageDollarValue 函数
function averageDollarValue(data) {
    let map = () => {
        return fp.map((item) => item.dollar_value, data)
    }
    let r = fp.flowRight(_average, map)
    return r()

}

console.log(averageDollarValue(cars))  // 最终返回 

/*
  练习4: 
  实现 sanitizeNames() 函数，要求使用 fp.flowRight()
  把 返回一个下划线连接的小写字符串，
  把数组中的 name 转换为这种形式： 例如：sanitizeNames(["Hello World"]) => ["hello_world"]
*/
// 把非字母数字替换为下划线
let _underscore = fp.replace(/\W+/g, '_') // <--无须改动

// // 1.实现 sanitizeNames 函数

function sanitizeNames(data) {
    const _underscore = fp.replace(/\W+/g, '_');
    const map = (arr) => {
        return fp.map(x => x.name, arr)
    }
    const mapToLower = (arr) => {
        return fp.map(x => fp.toLower(x), arr);
    }
    const map_underscore = (arr) => {
        return fp.map(x => _underscore(x), arr);
    }
    let r = fp.flowRight(map_underscore, mapToLower, map)
    return r(data)
}

// // 2.打印测试
// console.log( sanitizeNames(cars) )


